Skip to content

Add eidetic remember/recall memory skills#3

Merged
OriNachum merged 1 commit into
mainfrom
rollout/eidetic-memory
Jun 23, 2026
Merged

Add eidetic remember/recall memory skills#3
OriNachum merged 1 commit into
mainfrom
rollout/eidetic-memory

Conversation

@OriNachum

Copy link
Copy Markdown
Contributor

Vendors eidetic-cli's first-party remember + recall memory skills into this repo's .claude/skills/ kit (cite-don't-import), giving this agent a shared, persistent memory surface (~/.eidetic/memory) that Claude and the colleague backend both read and write.

  • remembereidetic remember: idempotent upsert of one JSON record or an NDJSON batch on stdin (dedup by id + content hash).
  • recalleidetic recall: four search modes (exact / approximate / keyword / hybrid), each hit carrying text, full provenance metadata, a relevance score, and a freshness signal.

The .sh wrappers are byte-verbatim from eidetic-cli (their first-party origin); this repo's SKILL.md scope examples are localized to its own nick. Version bumped + CHANGELOG updated per the AgentCulture rule. Runtime dep: the eidetic CLI on PATH (else a local eidetic-cli checkout + uv).

Propagated by rollout-cli's eidetic-memory recipe (origin: agentculture/eidetic-cli). Squash-merge at your discretion.

🤖 Generated with Claude Code

  • rollout-cli (Claude)

- **Vendored the `remember` + `recall` memory skills from eidetic-cli**
  (cite-don't-import) — the write/read halves of eidetic's shared
  `~/.eidetic/memory` surface, so this agent (Claude and its colleague backend)
  can persist facts across sessions and recall them later, sharing one store.
  `remember` drives `eidetic remember` (idempotent upsert of one JSON record or
  an NDJSON batch on stdin, dedup by id + content hash); `recall` drives
  `eidetic recall` with four search modes — exact / approximate / keyword /
  hybrid — each hit carrying text, full provenance metadata, a relevance score,
  and a freshness signal. The `.sh` wrappers are byte-verbatim from eidetic-cli
  (their first-party origin); each `SKILL.md` is localized only in the
  illustrative `--scope <nick>` examples (Provenance keeps "First-party to
  eidetic-cli"). Both default to this agent's PRIVATE scope, reading the suffix
  from `culture.yaml`. Runtime dep: the `eidetic` CLI on PATH (else a local
  eidetic-cli checkout with `uv`). Propagated by rollout-cli's `eidetic-memory`
  recipe.
@sonarqubecloud

Copy link
Copy Markdown

@qodo-code-review

Copy link
Copy Markdown

PR Summary by Qodo

Vendor eidetic remember/recall skills for shared persistent memory
✨ Enhancement 📝 Documentation ⚙️ Configuration changes 🕐 20-40 Minutes

Grey Divider

Description

• Add first-party /remember + /recall skills that wrap eidetic CLI memory storage/search.
• Default both skills to this repo’s private scope by reading suffix from culture.yaml.
• Bump version to 0.3.0 and document the new memory capability in CHANGELOG.
Diagram

graph TD
  A["Claude + colleague runtime"] --> B[["remember.sh wrapper"]] --> D["eidetic CLI"] --> E[("~/.eidetic/memory")]
  A --> C[["recall.sh wrapper"]] --> D --> E
  B --> F[/"culture.yaml suffix"/]
  C --> F
  D --> G{{"Embed server"}}
  subgraph Legend
    direction LR
    _rt["Runtime/Service"] ~~~ _sh[["Wrapper script"]] ~~~ _cfg[/"Config file"/] ~~~ _db[("Data store")] ~~~ _ext{{"External"}}
  end
Loading
High-Level Assessment

The chosen approach (vendored, cite-don’t-import skill kit with byte-verbatim wrappers) fits the repo’s established skill provenance model and avoids runtime coupling to internal Python APIs. Alternatives like importing eidetic-cli modules or symlinking to an upstream checkout would reduce duplication, but would weaken provenance determinism and complicate downstream consumption; keeping wrappers self-contained is the right tradeoff here.

Files changed (6) +599 / -1

Enhancement (2) +279 / -0
recall.shAdd recall wrapper for 'eidetic recall' with default scope injection +141/-0

Add recall wrapper for 'eidetic recall' with default scope injection

• Adds a bash wrapper that resolves the 'eidetic' CLI (PATH first, otherwise 'uv run' within an eidetic-cli checkout), injects '--scope <suffix> --visibility private' by default when culture.yaml is present, and forwards all user flags verbatim. Defaults embedding configuration via 'EIDETIC_EMBED_URL'/'EIDETIC_EMBED_MODEL' and executes 'eidetic recall' against the shared home-directory store.

.claude/skills/recall/scripts/recall.sh

remember.shAdd remember wrapper for 'eidetic remember' with portable CLI resolution +138/-0

Add remember wrapper for 'eidetic remember' with portable CLI resolution

• Adds a bash wrapper that finds 'eidetic' on PATH or falls back to 'uv run' from an eidetic-cli checkout, then runs 'eidetic remember' while forwarding all flags. Defaults to injecting the repo-derived '--scope <suffix>' and '--visibility private' (unless explicitly overridden) and sets default embedding endpoint environment variables.

.claude/skills/remember/scripts/remember.sh

Documentation (3) +319 / -0
SKILL.mdAdd /recall skill documentation and usage contract +181/-0

Add /recall skill documentation and usage contract

• Introduces the SKILL.md for the 'recall' command, describing search modes (exact/approximate/keyword/hybrid), output fields (score/signal/provenance), lifecycle inclusion flags, and the shared ~/.eidetic/memory store semantics. Documents default private personal scope behavior derived from culture.yaml and the requirement to use the wrapper script for portable CLI resolution.

.claude/skills/recall/SKILL.md

SKILL.mdAdd /remember skill documentation and record schema +118/-0

Add /remember skill documentation and record schema

• Introduces the SKILL.md for the 'remember' command, documenting JSON/NDJSON ingest, idempotent upsert and content-hash dedup behavior, and record fields including provenance metadata, 'supersedes', and 'links'. Clarifies the default private personal scope derived from culture.yaml and how to write public memories intentionally.

.claude/skills/remember/SKILL.md

CHANGELOG.mdDocument new eidetic memory skills in 0.3.0 release notes +20/-0

Document new eidetic memory skills in 0.3.0 release notes

• Adds a 0.3.0 entry describing vendoring of the remember/recall skills, the shared ~/.eidetic/memory surface, default scope behavior via culture.yaml, and the runtime dependency on the 'eidetic' CLI (or uv-based dev checkout fallback).

CHANGELOG.md

Other (1) +1 / -1
pyproject.tomlBump project version to 0.3.0 +1/-1

Bump project version to 0.3.0

• Updates the package version from 0.2.1 to 0.3.0 to align with the changelog entry for the new memory skills.

pyproject.toml

@qodo-code-review

Copy link
Copy Markdown

Code Review by Qodo

🐞 Bugs (3) 📘 Rule violations (1) 📜 Skill insights (1)

Context used
✅ Compliance rules (platform): 8 rules
✅ Skills: cicd

Grey Divider


Action required

1. Missing delta check note 📜 Skill insight ≡ Correctness
Description
This PR adds new files under .claude/skills/, which triggers the requirement to run an alignment
delta check and document any sibling follow-up needs in the review reply. The PR should not be
merged until the delta check result is explicitly noted.
Code

.claude/skills/recall/SKILL.md[R1-3]

+---
+name: recall
+type: command
Evidence
The checklist rule applies when any file under .claude/skills/ is modified; this PR adds new
skills (recall and remember), so the delta check + sibling follow-up note is required.

.claude/skills/recall/SKILL.md[1-3]
.claude/skills/remember/SKILL.md[1-3]
Skill: cicd

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
This PR modifies `.claude/skills/`, so an alignment delta check must be run and the results (including any sibling repo needing a follow-up PR) must be noted in the review reply.

## Issue Context
Compliance requires an explicit statement in the review reply that `workflow.sh delta` (or equivalent) was run and what siblings, if any, require follow-up.

## Fix Focus Areas
- .claude/skills/recall/SKILL.md[1-3]
- .claude/skills/remember/SKILL.md[1-3]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. recall.sh forwards exit codes 📘 Rule violation ≡ Correctness
Description
recall.sh and remember.sh use exec to run eidetic, which causes the scripts to pass through
whatever exit code eidetic (or a set -e failure) returns, potentially producing exit codes other
than 0, 1, or 2. This violates the exit-code restriction requirement for entry-point scripts.
Code

.claude/skills/recall/scripts/recall.sh[141]

+exec "${EIDETIC[@]}" recall "${SCOPE_ARGS[@]}" "$@"
Evidence
The compliance rule restricts all process exit codes to 0/1/2, but in both scripts the `exec ...
recall ... / exec ... remember ... invocation replaces the shell with the eidetic` process,
making the wrapper script’s exit status equal to the child process’s exit code; because eidetic
(and failures under set -euo pipefail) can return values outside 0/1/2, the scripts do not
constrain exit codes as required.

Rule 1014282: Restrict process exit codes to 0, 1, or 2 only
.claude/skills/recall/scripts/recall.sh[14-14]
.claude/skills/recall/scripts/recall.sh[141-141]
.claude/skills/remember/scripts/remember.sh[21-21]
.claude/skills/remember/scripts/remember.sh[138-138]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The `recall.sh` and `remember.sh` entry-point wrapper scripts can exit with arbitrary codes because they `exec` `eidetic` directly, and `set -euo pipefail` can also cause propagation of non-`0`/`1`/`2` exit codes.

## Issue Context
Compliance requires process exit codes to be restricted to `0`, `1`, or `2` only.

## Fix Focus Areas
- .claude/skills/recall/scripts/recall.sh[14-141]
- .claude/skills/remember/scripts/remember.sh[21-138]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Portability lint failure 🐞 Bug ☼ Reliability
Description
The new SKILL docs hard-code ~/.eidetic/memory, which matches the repo’s portability-lint rule
that flags ~/.<dotfile> references in committed .md/config files. Running
.claude/skills/cicd/scripts/portability-lint.sh on this PR will fail.
Code

.claude/skills/recall/SKILL.md[R11-14]

+  Shadowed and archived records are excluded by default; use
+  --include-shadowed / --include-archived to retrieve them. The store lives at
+  ~/.eidetic/memory (a home-dir path outside any git worktree); the wrapper
+  defaults queries to this agent's PERSONAL, PRIVATE scope (`--scope tensor-cli
Evidence
The new SKILL.md explicitly includes ~/.eidetic/memory, and the repo’s portability-lint explicitly
fails on ~/\.[A-Za-z] in markdown/config files (with carve-outs that do not include ~/.eidetic).

.claude/skills/recall/SKILL.md[11-14]
.claude/skills/remember/SKILL.md[11-13]
.claude/skills/cicd/scripts/portability-lint.sh[26-35]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The repo’s portability lint flags `~/.*` dotfile references in committed markdown/config files. The new memory skills document the store path as `~/.eidetic/memory`, which will be flagged.

## Issue Context
`portability-lint.sh` searches modified `.md|.yaml|.toml|.json` files for `~/\.[A-Za-z]` and fails unless the path matches one of a couple carve-outs.

## Fix Focus Areas
- .claude/skills/recall/SKILL.md[11-14]
- .claude/skills/remember/SKILL.md[11-13]
- .claude/skills/cicd/scripts/portability-lint.sh[26-35]

## Suggested fix approach
Change docs to use a portable form that doesn’t trip the lint, e.g. `$HOME/.eidetic/memory` (or `${HOME}/.eidetic/memory`) instead of `~/.eidetic/memory`. If you intentionally want to allow this dotdir literal, add a carve-out in `portability-lint.sh` for `~/.eidetic/`, but prefer the doc change to keep the lint strict.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

4. Broken uv fallback 🐞 Bug ☼ Reliability
Description
resolve_eidetic() only falls back to uv run --project … eidetic when it can find an ancestor
pyproject.toml whose name is eidetic-cli, which will never be true when these scripts are
vendored into this repo (the only ancestor pyproject is tensor-cli). As a result, the wrapper
hard-fails unless eidetic is already on PATH, contradicting the SKILL docs’ “else uv run from
the checkout” claim.
Code

.claude/skills/recall/scripts/recall.sh[R23-36]

+    # Dev fallback: inside the eidetic-cli checkout, run via uv.
+    local dir
+    dir=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
+    while [ -n "$dir" ] && [ "$dir" != "/" ]; do
+        if [ -f "$dir/pyproject.toml" ] \
+            && grep -q '^name = "eidetic-cli"' "$dir/pyproject.toml" 2>/dev/null; then
+            if command -v uv >/dev/null 2>&1; then
+                EIDETIC=(uv run --project "$dir" eidetic)
+                return 0
+            fi
+            break
+        fi
+        dir=$(dirname "$dir")
+    done
Evidence
The wrapper’s dev fallback requires finding an ancestor pyproject.toml whose name is
eidetic-cli, but this repo’s pyproject.toml is tensor-cli; therefore the fallback branch can
never be taken here. The SKILL.md still claims that fallback exists.

.claude/skills/recall/scripts/recall.sh[16-36]
pyproject.toml[1-4]
.claude/skills/recall/SKILL.md[42-44]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The vendored wrappers claim they can fall back to running `uv run …` from an `eidetic-cli` checkout, but the current search only works when the scripts themselves live inside an `eidetic-cli` repo (ancestor `pyproject.toml` must have `name = "eidetic-cli"`). In this repo, that condition never holds, so users without `eidetic` on PATH will always error.

## Issue Context
This repo’s `pyproject.toml` is `name = "tensor-cli"`, so the ancestor scan cannot succeed.

## Fix Focus Areas
- .claude/skills/recall/scripts/recall.sh[16-44]
- .claude/skills/remember/scripts/remember.sh[23-50]
- .claude/skills/recall/SKILL.md[42-44]
- .claude/skills/remember/SKILL.md[45-46]

## Suggested fix approach
Pick one:
1) Make the fallback actually usable when vendored (e.g., support an env var like `EIDETIC_CLI_PROJECT=/path/to/eidetic-cli` and if set use `uv run --project "$EIDETIC_CLI_PROJECT" eidetic`).
2) Or, remove/adjust the fallback claim in docs + error hint and clearly document that `eidetic` must be installed on PATH in this repo.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


5. Skill inventory docs stale 🐞 Bug ⚙ Maintainability
Description
This PR adds two new skills under .claude/skills/, but the repo’s skill inventory/provenance docs
still claim an “11 skills” kit and the provenance ledger table has no entries for
remember/recall. This makes the documented skill kit and provenance tracking incorrect after the
merge.
Code

.claude/skills/remember/SKILL.md[R1-20]

+---
+name: remember
+type: command
+description: >
+  Ingest records into the shared eidetic memory store so they can be recalled
+  later. Drives `eidetic remember`: accepts one record as a JSON object, or a
+  batch as NDJSON on stdin for bulk ingest. Upsert is idempotent by id (and
+  dedups by content hash) — re-remembering updates in place, never duplicates.
+  Stamps a `created` date on every record at ingest time. Accepts `supersedes`
+  (id of the record this one replaces, for within-scope shadowing via `sweep`)
+  and `links` (list of related-memory ids). The store lives at
+  ~/.eidetic/memory (a home-dir path outside any git worktree), and the wrapper
+  defaults records to this agent's PERSONAL, PRIVATE scope (`--scope tensor-cli
+  --visibility private`, suffix read from culture.yaml) so they don't leak to a
+  default/other-scope recall — Claude and the colleague backend still share them
+  because both resolve the same suffix via this skill. Pass `--visibility public`
+  to contribute to the shared public pool instead. Use when the user says
+  "remember this", "store this", "save to memory", "index these", "eidetic
+  remember", or when something learned this session should outlive it. Pairs with
+  the sibling /recall skill.
Evidence
README hard-codes an 11-skill count, while the provenance ledger table enumerates the existing
skills and does not include the newly added memory skills, making both documents out of date once
this PR lands.

README.md[7-13]
docs/skill-sources.md[23-36]
.claude/skills/remember/SKILL.md[1-20]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
The repository documentation still describes the `.claude/skills/` kit as the canonical 11-skill guildmaster kit and the provenance ledger omits the newly added `remember`/`recall` skills.

## Issue Context
This PR introduces new skills from a different upstream (eidetic-cli). The repo keeps a provenance ledger in `docs/skill-sources.md` and markets the kit in `README.md`.

## Fix Focus Areas
- README.md[7-13]
- docs/skill-sources.md[23-36]

## Suggested fix approach
- Update README wording/count (or remove the hard-coded number).
- Add rows in `docs/skill-sources.md` for `remember` and `recall` with upstream/origin notes (eidetic-cli) and last-synced date/version, consistent with the existing table format.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Comment on lines +1 to +3
---
name: recall
type: command

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Missing delta check note 📜 Skill insight ≡ Correctness

This PR adds new files under .claude/skills/, which triggers the requirement to run an alignment
delta check and document any sibling follow-up needs in the review reply. The PR should not be
merged until the delta check result is explicitly noted.
Agent Prompt
## Issue description
This PR modifies `.claude/skills/`, so an alignment delta check must be run and the results (including any sibling repo needing a follow-up PR) must be noted in the review reply.

## Issue Context
Compliance requires an explicit statement in the review reply that `workflow.sh delta` (or equivalent) was run and what siblings, if any, require follow-up.

## Fix Focus Areas
- .claude/skills/recall/SKILL.md[1-3]
- .claude/skills/remember/SKILL.md[1-3]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

: "${EIDETIC_EMBED_MODEL:=Qwen/Qwen3-Embedding-0.6B}"
export EIDETIC_EMBED_URL EIDETIC_EMBED_MODEL

exec "${EIDETIC[@]}" recall "${SCOPE_ARGS[@]}" "$@"

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. recall.sh forwards exit codes 📘 Rule violation ≡ Correctness

recall.sh and remember.sh use exec to run eidetic, which causes the scripts to pass through
whatever exit code eidetic (or a set -e failure) returns, potentially producing exit codes other
than 0, 1, or 2. This violates the exit-code restriction requirement for entry-point scripts.
Agent Prompt
## Issue description
The `recall.sh` and `remember.sh` entry-point wrapper scripts can exit with arbitrary codes because they `exec` `eidetic` directly, and `set -euo pipefail` can also cause propagation of non-`0`/`1`/`2` exit codes.

## Issue Context
Compliance requires process exit codes to be restricted to `0`, `1`, or `2` only.

## Fix Focus Areas
- .claude/skills/recall/scripts/recall.sh[14-141]
- .claude/skills/remember/scripts/remember.sh[21-138]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +11 to +14
Shadowed and archived records are excluded by default; use
--include-shadowed / --include-archived to retrieve them. The store lives at
~/.eidetic/memory (a home-dir path outside any git worktree); the wrapper
defaults queries to this agent's PERSONAL, PRIVATE scope (`--scope tensor-cli

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

4. Portability lint failure 🐞 Bug ☼ Reliability

The new SKILL docs hard-code ~/.eidetic/memory, which matches the repo’s portability-lint rule
that flags ~/.<dotfile> references in committed .md/config files. Running
.claude/skills/cicd/scripts/portability-lint.sh on this PR will fail.
Agent Prompt
## Issue description
The repo’s portability lint flags `~/.*` dotfile references in committed markdown/config files. The new memory skills document the store path as `~/.eidetic/memory`, which will be flagged.

## Issue Context
`portability-lint.sh` searches modified `.md|.yaml|.toml|.json` files for `~/\.[A-Za-z]` and fails unless the path matches one of a couple carve-outs.

## Fix Focus Areas
- .claude/skills/recall/SKILL.md[11-14]
- .claude/skills/remember/SKILL.md[11-13]
- .claude/skills/cicd/scripts/portability-lint.sh[26-35]

## Suggested fix approach
Change docs to use a portable form that doesn’t trip the lint, e.g. `$HOME/.eidetic/memory` (or `${HOME}/.eidetic/memory`) instead of `~/.eidetic/memory`. If you intentionally want to allow this dotdir literal, add a carve-out in `portability-lint.sh` for `~/.eidetic/`, but prefer the doc change to keep the lint strict.

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

@OriNachum OriNachum merged commit c75cab4 into main Jun 23, 2026
8 checks passed
@OriNachum OriNachum deleted the rollout/eidetic-memory branch June 23, 2026 17:28
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant